package config

import (
	"fmt"
	"log"
	"os"

	"gopkg.in/yaml.v3"
)


type RPCConfig struct {
	   Sepolia string `yaml:"sepolia"` // Sepolia测试网RPC地址（HTTP/HTTPS）
	   SepoliaWS string `yaml:"sepolia_ws"`  // Sepolia测试网WebSocket地址（用于订阅）
	   Mainnet string `yaml:"mainnet"`     // 主网WebSocket地址（用于订阅）
	   MainnetWS string `yaml:"mainnet_ws"`  // 主网WebSocket地址（用于订阅）

	   PubblicNode string `yaml:"publicnode"`  // 主网WebSocket地址（用于订阅）
}

type AccountConfig struct {
	   PrivateKey string `yaml:"privatekey"`  // 私钥
	   description string `yaml:"description"`  // 描述
}

type AccountsConfig struct {
	   Main AccountConfig `yaml:"main"`  //主账户 
	   Test AccountConfig `yaml:"test"`  // 测试账户
}

type AddressesConfig struct {
	   Recipient string `yaml:"recipient"`  //  接收方地址
	   Sender string `yaml:"sender"` // 发送方地址（用于查询余额等）
	   TokenContract string `yaml:"token_contract"` // 代币合约地址
	   CounterContract string `yaml:"counterContract"` // Counter合约地址
}


// TransactionConfig 交易配置
type TransactionConfig struct {
	GasLimit    uint64 `yaml:"gas_limit"`    // Gas限制
	EthAmount   string `yaml:"eth_amount"`   // ETH转账金额（wei）
	TokenAmount string `yaml:"token_amount"` // 代币转账数量
}





type Config struct {
	RPC   RPCConfig  `yaml:"rpc"` //RPC节点配置
	Accounts   AccountsConfig  `yaml:"accounts"` //账户配置
	Addresses	AddressesConfig `yaml:addresses"` //账户配置
	Transaction	TransactionConfig `yaml:transaction"` //账户配置
	
}



func Loadconfig(fileName string)(*Config,error){
	data,err := os.ReadFile(fileName)
	if err!=nil{
		// %w  就是“把旧错误包进新错误”的专用占位符
		return nil ,fmt.Errorf("读取配置文件失败:%w",err)
	}
	//解析YAML
	var config Config
	err = yaml.Unmarshal(data,&config)
	if err!=nil{
		return nil,fmt.Errorf("解析配置文件失败:%w",err)
	}
	return &config,nil
}



// MustLoadConfig 加载配置，失败则终止程序
func MustLoadConfig(filename string) *Config {
	cfg, err := Loadconfig(filename)
	if err != nil {
		log.Fatalf("加载配置失败: %v", err)
	}
	return cfg
}
